package utils

import (
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"go-likaladi-shop/common/base_util"
	"go.uber.org/zap"
)

// 定义一个内存存储对象，base64Captcha 提供的默认内存存储器，支持内存中的验证码存储与校验
var store = base64Captcha.DefaultMemStore

// Captcha 定义了前端返回的验证码结构体
type Captcha struct {
	CaptchaId string `json:"captchaId"` // 验证码 ID，用于标识验证码（前端提交验证时带回）
	PicPath   string `json:"picPath"`   // 验证码图片 base64 数据，前端直接展示图片
	Answer    string `json:"answer"`    // 验证码答案（通常不用返回给前端，这里只是结构定义）
}

func CaptchaCreate(ctx *gin.Context) {
	// 创建一个数字验证码的驱动
	// 参数说明：
	// 高度：80px
	// 宽度：240px
	// 长度：验证码字符数（这里是 5 位数字）
	// 最大干扰强度：0.7（越大越难识别）
	// 背景干扰点数：80
	driver := base64Captcha.NewDriverDigit(80, 240, 5, 0.7, 80)

	// 使用 driver（驱动）和 store（存储）创建验证码对象
	cp := base64Captcha.NewCaptcha(driver, store)

	// 生成验证码
	// id：验证码 ID，唯一标识本次验证码
	// b64s：验证码图片的 base64 编码，前端直接使用 <img> 标签显示
	// answer：验证码答案（此处为纯数字）
	// err：错误信息
	id, b64s, answer, err := cp.Generate()

	zap.S().Infof("图片验证码: %s", answer)

	// 判断是否生成成功
	if err != nil {
		// 打印错误日志
		zap.S().Error("生成验证码错误: ", err.Error())

		// 返回 HTTP 500 错误响应
		base_util.HttpError("生成验证码错误", ctx)
		return
	}

	base_util.RespSuccess(Captcha{
		CaptchaId: id,   // 返回验证码 ID（前端在校验时回传该 ID）
		PicPath:   b64s, // 返回验证码图片 base64 字符串
	}, ctx)
}

func CaptchaValidate(captchaId, captcha string, ctx *gin.Context) bool {
	//图片验证校验
	if !store.Verify(captchaId, captcha, true) {
		base_util.HttpError("验证码错误", ctx)
		return false
	}
	return true
}
